package UILayer;
import java.util.Scanner;
import controlLayer.*;

/**
 * Denne klasse er vores varer grænseflade, vi bruger den i main menu til at arbejde med varer klassen
 * i de andre lag.
 * 
 * @author Gruppe 2
 * @version 1.0
 */
public class VareKartotekUI
{
    private VareKartotekCTR vareKartotekCtr;

    /**
     * Vores constructor for VareKartotek, skaber forbindelse mellem varer UI og varer controlleren
     */
    public VareKartotekUI()
    {
        vareKartotekCtr = new VareKartotekCTR();
    }

    /**
     * Vores metode til at starte varer menuen, bliver kaldt af main menu.
     */
    public void start()
    {
        vareMenu();
    }

    /**
     * Metoden som skaber vores varer menu, vi har indbygget beskyttelse mod brug af andre tal ind de åbenlyse muligheder. Varer menuen kalder metoder længere nede i klassen,
     * disse metoder er vores adgang til de andre lag.
     */
    public void vareMenu()
    {
        boolean exit = false;
        while(!exit)
        {
            //show menu and return the user's choise
            int choice =   writeVareMenu();
            if(choice != 1 && choice != 2 && choice !=3 && choice !=4 && choice != 5 && choice != 6)
            {
                System.out.println("Du skal enten vælge 1, 2, 3, 4, 5 eller 6");
            }
            if (choice == 1)
            {
                findVare();
            }
            else{if(choice == 2){
                    opretVare();
                }
                else{
                    if(choice == 3)
                    {
                        opretVareGruppe();
                    }
                    else{
                        if(choice == 4){
                            opdaterVare();
                        }
                        else{
                            if(choice == 5){
                                sletVare();
                            }
                            else{
                                if(choice == 6){
                                    listAlleVare();
                                }
                                else{   

                                    if(choice == 7)
                                    {
                                        exit = true;
                                    }
                                }//end else
                            }//end else
                        }//end else
                    }//end else
                }//end else

            }//end else
        }//end while
    }

    /**
     * Metoden som skriver selve varer metoden, den viser brugeren hvad valgene er og modtager inputte som menuen bruger. Vi har indbygget beskyttelse mod brugen af bogstaver.
     * @return int choice
     */
    private int writeVareMenu()
    {
        // creates an object keyboard to read data from the keyboard
        Scanner keyboard = new Scanner(System.in);
        System.out.println(" *** Vare Menu ***");
        System.out.println(" (1) Vis Vare information");
        System.out.println(" (2) Opret Vare");
        System.out.println(" (3) Opdater Vare");
        System.out.println(" (4) Slet Vare");
        System.out.println(" (5) Vis vareregister");        
        System.out.println(" (6) Gå til hovedmenu");
        System.out.println("\n Tag dit valg: ");

        int choice = 0;
        boolean ok = false;
        while(!ok)
        {
            try
            {
                choice = keyboard.nextInt();
                ok = true;
            }
            catch (Exception e)
            {
                System.out.println("Der skal indtastes et nummer - prøv igen");
                String input = keyboard.nextLine();
            }

        }//end while
        return choice;
    }

    /**
     * Vores metode for at inputte vareid, bliver brugt i forskellige metoder, og har indbygget beskyttelse mod brugen af bogstaver.
     * @param long vareId
     * @return long id
     */
    private long inputVareId()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Skriv varens id: ");
        long id = 0;
        boolean ok = false;
        while(!ok)
        {
            try
            {
                id = keyboard.nextLong();
                ok = true;
            }
            catch (Exception e)
            {
                System.out.println("Der skal indtastes et nummer - prøv igen");
                String input = keyboard.nextLine();
            }

        }//end while
        return id;
    }

    /**
     * Vores metode for at inputte ny vareid, bliver brugt i forskellige metoder, og har indbygget beskyttelse mod brugen af bogstaver.
     * @param long nyVareId
     * @return long nyId
     */
    private long inputNyVareId()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Skriv ny varens ny id: ");
        long nyId = 0;
        boolean ok = false;
        while(!ok)
        {
            try
            {
                nyId = keyboard.nextLong();
                ok = true;
            }
            catch (Exception e)
            {
                System.out.println("Der skal indtastes et nummer - prøv igen");
                String input = keyboard.nextLine();
            }

        }//end while
        return nyId;
    }

    /**
     * Vores metode for at inputte et varegruppe stregkode, bliver brugt i forskellige metoder, og har indbygget beskyttelse mod brugen af bogstaver.
     * @param long vareGruppeStregkode
     * @return long stregkode
     */
    private long inputVareGruppeStregkode()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Skriv varens stregkode: ");
        long stregkode = 0;
        boolean ok = false;
        while(!ok)
        {
            try
            {
                stregkode = keyboard.nextLong();
                ok = true;
            }
            catch (Exception e)
            {
                System.out.println("Der skal indtastes et nummer - prøv igen");
                String input = keyboard.nextLine();
            }

        }//end while
        return stregkode;
    }

    /**
     * Vores metode for at inputte ny varegruppe stregkode, bliver brugt i forskellige metoder, og har indbygget beskyttelse mod brugen af bogstaver.
     * @param long vareGruppeNyStregkode
     * return long nyStregkode
     */
    private long inputVareGruppeNyStregkode()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Skriv varens ny stregkode: ");
        long nyStregkode = 0;
        boolean ok = false;
        while(!ok)
        {
            try
            {
                nyStregkode = keyboard.nextLong();
                ok = true;
            }
            catch (Exception e)
            {
                System.out.println("Der skal indtastes et nummer - prøv igen");
                String input = keyboard.nextLine();
            }

        }//end while
        return nyStregkode;
    }

    /**
     * En metode til at inputte varegruppe placering
     * @param String vareGruppePlacering
     * @return String placering
     */
    private String inputVareGruppePlacering()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Skriv varens placering: ");
        String placering = keyboard.nextLine();
        return placering;
    }

    /**
     * En metode til at inputte varegruppe beskrivelse
     * @param String vareGruppeBeskrivelse
     * @return String beskrivelse
     */
    private String inputVareGruppeBeskrivelse()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Skriv varens beskrivelse: ");
        String beskrivelse = keyboard.nextLine();
        return beskrivelse;
    }

    /**
     * Vores metode for at inputte varegruppe pris, bliver brugt i forskellige metoder, og har indbygget beskyttelse mod brugen af bogstaver.
     * @param int vareGruppePris
     * @return int pris
     */
    private int inputVareGruppePris()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Skriv varens pris: ");
        int pris = 0;
        boolean ok = false;
        while(!ok)
        {
            try
            {
                pris = keyboard.nextInt();
                ok = true;
            }
            catch (Exception e)
            {
                System.out.println("Der skal indtastes et nummer - prøv igen");
                String input = keyboard.nextLine();
            }

        }//end while
        return pris;
    }

    /**
     * Vores metode til at oprette en vare, bruger flere af vores input metoder til at få de variabler den skal bruge.
     * @param vareId
     * @param vareGruppeStregkode
     */
    private void opretVare()
    {
        long id = inputVareId();
        long stregkode = inputVareGruppeStregkode();
        if(vareKartotekCtr.findVareGruppe(stregkode) != null)
        {
            vareKartotekCtr.opretVare(stregkode, id);
        }
        else
        {
            System.out.println("Du skal oprette en VareGruppe først");
        }
    }

    /**
     * Vores metode til at oprette en varegruppe, bruger flere af vores input metoder til at få de variabler den skal bruge.
     * @param long vareGruppeStregkode
     * @param String vareGruppePlacering
     * @param String vareGruppeBeskrivelse
     * @param int vareGruppePris
     */
    private void opretVareGruppe()
    {
        long stregkode = inputVareGruppeStregkode();
        String placering = inputVareGruppePlacering();
        String beskrivelse = inputVareGruppeBeskrivelse();
        int pris = inputVareGruppePris();
        vareKartotekCtr.opretVareGruppe(placering, stregkode, beskrivelse, pris);
    }

    /**
     * Vores metode til at finde en varer. Bruger vores input metode for vareid.
     * @param long vareId
     * @param long vareGruppeStregkode
     */
    private void findVare()
    {
        long id = inputVareId();
        long stregkode = inputVareGruppeStregkode();
        vareKartotekCtr.findVare(stregkode, id);
    }

    /**
     * Vores metode til at finde en varegruppe. Bruger vores input metode for varegruppe stregkode
     * @param long vareGruppeStregkode
     */
    private void findVareGruppe()
    {
        long stregkode = inputVareGruppeStregkode();
        vareKartotekCtr.findVareGruppe(stregkode);
    }

    /**
     * Vores metode til at finder en varer via id eller stregkode og opdaterer oplysningerne for varen
     * @param long vareId
     * @param long nyVareId
     * @param long vareGruppeStregkode 
     */
    private void opdaterVare()
    {
        long id = inputVareId();
        long nyId = inputNyVareId();
        long stregkode = inputVareGruppeStregkode();
        vareKartotekCtr.opdaterVare(stregkode, id, nyId);
    }

    /**
     * Vores metode til at finder en varegruppe via stregkode og opdaterer oplysningerne for varen
     * @param long vareGruppeStregkode
     * @param long vareGruppeNyStregkode
     * @param String vareGruppePlacering
     * @param String vareGruppeBeskrivelse
     * @param int vareGruppePris
     */
    private void opdaterVareGruppe()
    {
        long stregkode = inputVareGruppeStregkode();
        long nyStregkode = inputVareGruppeNyStregkode();
        String placering = inputVareGruppePlacering();
        String beskrivelse = inputVareGruppeBeskrivelse();
        int pris = inputVareGruppePris();
        vareKartotekCtr.opdaterVareGruppe(stregkode, placering, nyStregkode,  beskrivelse, pris);
    }

    /**
     * Vores metode som sletter varer. Bruger vores input metode for vareid og varegruppe stregkode.
     * @param long vareId
     * @param long vareGruppeStregkode
     */
    private void sletVare()
    {
        long id = inputVareId();
        long stregkode = inputVareGruppeStregkode();
        vareKartotekCtr.fjernVare(stregkode, id);
    }

    /**
     * Vores metode som udskriver alle varer.
     */
    private void listAlleVare()
    {
        System.out.println(vareKartotekCtr.printVareKartotek()+"\n");
    }

}
